package QianFeng09.ThreadDemo;

/**
 * 线程死锁:在一个同步方法中调用了另一个对象的同步方法，可以产生死锁
 *
 * 过多的同步有可能出现死锁，死锁的操作一般是在程序运行的时候才有可能出现。
 * 多线程中要进行资源的共享,就需要同步，但同步过多，就可能造死锁。
 **/
public class ThreadDeadLock {
    public static void main(String[] args) {
        new DeadThread();
    }
}

//顾客
class Customer {
    public synchronized void say(Waiter waiter) {
        System.out.println("顾客说：先吃饭再买单");
        waiter.doService();
    }
    public synchronized void doService() {
        System.out.println("同意了，买完单再吃饭！");
    }
}

//服务员
class Waiter {
    public synchronized void say(Customer customer) {
        System.out.println("服务员：先买单在吃饭！");
        customer.doService();
    }
    public synchronized void doService() {
        System.out.println("同意了，吃完饭再买单！");
    }
}

//死锁线程
class DeadThread implements Runnable {
    Customer customer = new Customer();
    Waiter waiter = new Waiter();
    public DeadThread() {
        new Thread(this).start();
        waiter.say(customer);
    }
    @Override
    public void run() {
        customer.say(waiter);
    }
}

